package club.jdiy.core.storage;


/**
 * 指示实体的Storable可存储附件特性．
 * 以便您在调用Controller/Service中相应的remove方法时，JDiy会自动连同该实体的store附件一并删除,这样可以减少存储空间的浪费．
 * 相应的，Storable后的实体在remove时，由于需要额外的对这些附件进行删除操作，因此会有一定的性能影响.
 * <p>
 * 即便实体有store附件关联，Storable并不是必须的．您也可以自己以编程方式去对这些数据进行删除处理．
 *
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20200725
 */
@SuppressWarnings("unused")
public interface Storable<T> {

    T getId();

    Store getStore();

    /**
     * 指示该实体关联的附件存储桶 (同一个桶中的数据实体id必须是整桶唯一的).
     * 注意这儿的 bucket并不等于相关云存储（例如七牛）里同的bucket概念．它只是JDiy本身的一种存储逻辑区分．
     *
     * @return storeBucket
     */
    default String getStoreBucket() {
        return null;
    }

    /**
     * store初始化.
     *
     * @param appContext jdiy AppContext对象
     */
    Storable<T> initStore(StoreAware appContext);

}
